package Data::Conveyor::Service::Result::Tabular_TEST;

# $Id: Stage_TEST.pm 11275 2006-04-26 10:53:05Z gr $

use strict;
use warnings;
use Error::Hierarchy::Test 'throws2_ok';
use Test::More;


our $VERSION = '0.02';


use base 'Data::Conveyor::Test';


use constant PLAN => 5;


sub run {
    my $self = shift;
    $self->SUPER::run(@_);

    $self->test_list_of_hashes_input;
    $self->test_list_of_objects_input_ok;
    $self->test_list_of_objects_input_no_baz;
}


sub test_list_of_hashes_input {
    my $self = shift;

    my $o = $self->make_real_object;

    my $rows = [
        { foo => 'row0foo', bar => 'row0bar', baz => 'row0baz' },
        { foo => 'row1foo', bar => 'row1bar', baz => 'row1baz' },
        { foo => 'row2foo', bar => 'row2bar', baz => 'row2baz' },
    ];

    $o->set_from_rows(
        fields => [ qw/foo bar baz/ ],
        rows   => $rows,
    );

    is_deeply(scalar $o->rows, [
        [ qw/row0foo row0bar row0baz/ ],
        [ qw/row1foo row1bar row1baz/ ],
        [ qw/row2foo row2bar row2baz/ ],
    ], 'list of hashes input: rows()');

    is_deeply(scalar $o->result_as_list_of_hashes, $rows,
        'list of hashes input: result_as_list_of_hashes()');
}


sub test_list_of_objects_input_ok {
    my $self = shift;

    my $o = $self->make_real_object;

    my $rows = [
        Data::Conveyor::Temp001->new(row => 0),
        Data::Conveyor::Temp001->new(row => 1),
        Data::Conveyor::Temp001->new(row => 2),
    ];

    $o->set_from_rows(
        fields => [ qw/foo bar baz/ ],
        rows   => $rows,
    );

    is_deeply(scalar $o->rows, [
        [ qw/row0foo row0bar row0baz/ ],
        [ qw/row1foo row1bar row1baz/ ],
        [ qw/row2foo row2bar row2baz/ ],
    ], 'list of objects input (ok): rows()');

    is_deeply(scalar $o->result_as_list_of_hashes, [
        { foo => 'row0foo', bar => 'row0bar', baz => 'row0baz' },
        { foo => 'row1foo', bar => 'row1bar', baz => 'row1baz' },
        { foo => 'row2foo', bar => 'row2bar', baz => 'row2baz' },
    ], 'list of objects input (ok): result_as_list_of_hashes()');
}


sub test_list_of_objects_input_no_baz {
    my $self = shift;

    my $o = $self->make_real_object;

    my $rows = [
        Data::Conveyor::Temp002->new(row => 0),
        Data::Conveyor::Temp002->new(row => 1),
        Data::Conveyor::Temp002->new(row => 2),
    ];

    throws2_ok {
        $o->set_from_rows(
            fields => [ qw/foo bar baz/ ],
            rows   => $rows,
        );
    } 'Error::Hierarchy::Internal::CustomMessage',
      qr/can't set field \[baz\] from row \[Data::Conveyor::Temp002=HASH\(/,
      "set_from_rows() using objects that can't baz()";
}



package Data::Conveyor::Temp001;

use base 'Class::Accessor::Complex';

__PACKAGE__
    ->mk_new
    ->mk_scalar_accessors(qw(row));

sub foo { sprintf 'row%dfoo', $_[0]->row }
sub bar { sprintf 'row%dbar', $_[0]->row }
sub baz { sprintf 'row%dbaz', $_[0]->row }


package Data::Conveyor::Temp002;

use base 'Class::Accessor::Complex';

__PACKAGE__
    ->mk_new
    ->mk_scalar_accessors(qw(row));

sub foo { sprintf 'row%dfoo', $_[0]->row }
sub bar { sprintf 'row%dbar', $_[0]->row }
# this class can't baz()


1;


__END__

{% USE p = PodGenerated %}

=head1 NAME

{% p.package %} - stage-based conveyor-belt-like ticket handling system

=head1 SYNOPSIS

    {% p.package %}->new;

=head1 DESCRIPTION

None yet. This is an early release; fully functional, but undocumented. The
next release will have more documentation.

=head1 METHODS

=over 4

{% p.write_methods %}

=back

{% p.write_inheritance %}

{% PROCESS standard_pod %}

=cut

